// Package sales
// @Author CN華少 2024/7/12 下午10:10
package sales

import (
	"github.com/shopspring/decimal"
)

// updateSalesDetailItemPrice
// @Description: 计算销售明细各项成本和利润价格
// @receiver sdi
// @return error
func (salesDetailItem *SalesDetailItem) updateSalesDetailItemPrice(purchaseUnitCost decimal.Decimal) error {
	var (
		sdiCostUnitPrice decimal.Decimal // 销售成本单价
		sdiFullCostPrice decimal.Decimal // 销售成本总价
		sdiPureProfit    decimal.Decimal // 销售纯利润
	)
	// 采购成本单价
	sdiCostUnitPrice = purchaseUnitCost
	// 采购成本总价=销售成本单价*销售数量
	sdiFullCostPrice = sdiCostUnitPrice.Mul(salesDetailItem.SdiQuantity) // 销售成本总价=销售成本单价*销售数量
	// 销售纯利润
	sdiPureProfit = salesDetailItem.SdiActualAmount.Sub(sdiFullCostPrice) // 销售纯利润=销售实际总价-采购成本总价
	// 成本单价，采购单中的采购单价（成本单价
	salesDetailItem.SdiCostUnitPrice = sdiCostUnitPrice
	// 成本总价，采购单价*销售数量
	salesDetailItem.SdiFullCostPrice = sdiFullCostPrice
	// 销售纯利润
	salesDetailItem.SdiPureProfit = sdiPureProfit
	return nil
}

// 依据销售单ID进行计算该销售单中计算项并更新
func updateSalesDetailPrice(salesId int) error {
	// 获取指定销售单和其具体明细信息
	salesDetail, _ := GetSalesDetailInfoAndItems(salesId)
	var (
		salesPureProfit       decimal.Decimal // 总计纯利润
		salesTotalPrice       decimal.Decimal // 自动总金额
		salesActualTotalPrice decimal.Decimal // 实际销售总金额
	)
	// 遍历销售单明细
	for _, item := range salesDetail.Items {
		salesTotalPrice = salesTotalPrice.Add(item.TotalPrice)                  // 自动总金额
		salesActualTotalPrice = salesActualTotalPrice.Add(item.SdiActualAmount) // 实际总金额
		salesPureProfit = salesPureProfit.Add(item.SdiPureProfit)               // 总计纯利润
	}
	// 获取采购单该项产品成本价格 获取采购明细详情
	// purchaseDetail, _ := purchase.GetPurchaseInfo(salesDetail.PurchaseId)
	// 总计销售纯利润=销售单明细中纯利润总和-采购单中采购运费
	// salesDetail.SalesPureProfit = salesPureProfit.Sub(decimal.NewFromInt32(int32(purchaseDetail.PurchaseFreight)))
	// 总计销售纯利润
	salesDetail.SalesPureProfit = salesPureProfit
	// 总计销售自动总金额
	salesDetail.SalesTotalPrice = salesTotalPrice
	// 实际销售总金额
	salesDetail.SalesActualTotalPrice = salesActualTotalPrice
	salesDetail.Items = nil
	err := salesDetail.UpdateSalesDetail()
	return err
}
